package scr.hotel;

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;

public class Operacao implements ActionListener{
		
	public static void CheckIn(Cliente cliente, Quarto quarto)
	{
		quarto.setOcupado(true);
		quarto.setCpfCliente(cliente.getCpf());
		cliente.setQuartoAtual(quarto.getNumero());
		
		Quarto.atualizar(quarto);
		Cliente.atualizar(cliente);
	}
	
	public static int CheckOut(Cliente cliente, Quarto quarto)
	{
		int diarias = cliente.getDiarias();

		cliente.setDiarias(0);
		quarto.setOcupado(false);
		quarto.setCpfCliente("");
		cliente.setQuartoAtual("");

		Quarto.atualizar(quarto);
		Cliente.atualizar(cliente);
		
		return diarias;
	}
	
	public static void setLimpeza(Quarto quarto, boolean ausente)
	{
		quarto.setLimpeza(ausente);
		Quarto.atualizar(quarto);
	}
	
	public static void setAusente(Quarto quarto, boolean ausente)
	{
		quarto.setAusente(ausente);
		Quarto.atualizar(quarto);		
	}

	public static void setManutencao(Quarto quarto, boolean manutencao)
	{
		quarto.setManutencao(manutencao);
		Quarto.atualizar(quarto);		
	}

	public static void setServico(Quarto quarto, boolean servico)
	{
		quarto.setServicoDeQuarto(servico);
		Quarto.atualizar(quarto);		
	}

	public static void setReservado(Quarto quarto, boolean reservado)
	{
		quarto.setReservado(reservado);
		Quarto.atualizar(quarto);		
	}
	
	public static void setNPertube(Quarto quarto, boolean NPertube)
	{
		quarto.setNpertube(NPertube);
		Quarto.atualizar(quarto);		
	}
	
	public static void setRecado(Quarto quarto, boolean recado, String mensagem)
	{
		quarto.setRecado(recado);
		if ( recado == true) quarto.setMensagem(mensagem);
		else quarto.setMensagem("");
		Quarto.atualizar(quarto);		
	}

	public static void recadoEntregue(Quarto quarto)
	{
		quarto.setRecado(false);
		quarto.setMensagem("");
		Quarto.atualizar(quarto);		
	}	
	

	public void actionPerformed(ActionEvent event)
	{  

		cont++;
		if (cont == 48) {
			
			incrementarDiarias();
			System.out.println("FUNCIONA");
			cont = 0;
		}

		Date now = new Date();
		System.out.println("At the tone, the time is " + now);
//		Toolkit.getDefaultToolkit().beep();
	}
	
	/*
	 * incrementa as diarias de todos os clientes que estao no hotel
	 */
	private void incrementarDiarias()
	{
		LinkedList listagem = Quarto.listarQuartos();
		
		for(int i=0; i < listagem.size(); i++)
		{
			Quarto quarto = (Quarto)listagem.get(i);
			if( quarto.getOcupado() == true )
			{
				Cliente cliente = Cliente.buscaPorQuarto(quarto);

				cliente.setDiarias(cliente.getDiarias() + 1);
				
				Cliente.atualizar(cliente);
			}
			else
			{
				
			}
		}
	}

	/*
	 * Percorre todas as reservas checando quais delas iniciam no dia atual
	 * seta o quarto como reservado.
	 * Para reservas em que nao foi feito o checkin, verifica se a reserva
	 * expirou, neste caso, cancela a reserva.
	 */
	private void setarReservasParaDia()
	{
		GregorianCalendar hoje = new GregorianCalendar();
		int dia = hoje.DATE;
		int mes = hoje.MONDAY;
		int ano = hoje.YEAR;
		
		Date dataHoje = new Date();
		dataHoje.setTime(0);
		dataHoje.setDate(dia);
		dataHoje.setMonth(mes);
		dataHoje.setYear(ano-1900);
		

		LinkedList listaReservas = Reserva.listarReservas();
		LinkedList busca = Quarto.listarQuartos();
				
		for(int i=0; i < busca.size() && !(busca.isEmpty()); i++ )
		{
			Quarto quarto  = (Quarto) busca.get(i);
			for(int j = 0; j < listaReservas.size(); j++)
			{
				Reserva reservaExistente = (Reserva) listaReservas.get(j);
				Date inicioExistente = reservaExistente.getInicioReserva();
				Date fimExistente = reservaExistente.getFimReserva();
				
				if(quarto.getNumero().equals(reservaExistente.getNumeroDoQuarto()))
				{
					if(dataHoje.equals(inicioExistente) )
					{
						quarto.setReservado(true);
						Quarto.atualizar(quarto);
					}
					
					if(dataHoje.after(fimExistente))
					{
						quarto.setReservado(false);
						Quarto.atualizar(quarto);
						Reserva.cancelarReserva(reservaExistente);
					}
				}
			}
		}
	}	
	
	public static void atualizarAoIniciar()
	{
		GregorianCalendar hoje = new GregorianCalendar();
		System.out.println(hoje);
		int dia = hoje.DAY_OF_MONTH;
		int mes = hoje.MONTH;
		int ano = hoje.YEAR;
		
		Date dataHoje = new Date();
//		dataHoje.setTime(0);
		dataHoje.setSeconds(00);
		dataHoje.setMinutes(00);
		dataHoje.setHours(12);
			
		dataHoje.setDate(dia);
		dataHoje.setMonth(mes);
		dataHoje.setYear(ano);

		// data do ultimo logout
		Date ultimoLogOut = Tempo.getTempo();

		System.out.println("DIA: " + ultimoLogOut.getDate());
		System.out.println("DIA: " + ultimoLogOut.getMonth());
		System.out.println("DIA: " + ultimoLogOut.getYear());
		
		
		// numero de dias desde o ultimo logout
		int incrementos = Tempo.getDaysPassedSince(ultimoLogOut);
		
		// todas as reservas
		LinkedList listaReservas = Reserva.listarReservas();
		// todos os quartos
		LinkedList busca = Quarto.listarQuartos();


		for(int y=0; y <= incrementos; y++)
		{
			System.out.println("Y: " + y);

			for(int i=0; i < busca.size() && !(busca.isEmpty()); i++ )
			{
				System.out.println("	i: " + i);

				Quarto quarto  = (Quarto) busca.get(i);
				for(int j = 0; j < listaReservas.size(); j++)
				{
					Reserva reservaExistente = (Reserva) listaReservas.get(j);
					Date inicioExistente = reservaExistente.getInicioReserva();
					Date fimExistente = reservaExistente.getFimReserva();
					if(quarto.getNumero().equals(reservaExistente.getNumeroDoQuarto()))
					{
						System.out.println("		j: " + j);
						
						if(dataHoje.equals(inicioExistente) )
						{
							System.out.println("		TESTE: " +  dataHoje.equals(inicioExistente));

							quarto.setReservado(true);
							Quarto.atualizar(quarto);
							System.out.println("TESTE: " + quarto);
						}
						else
						{
							System.out.println("		TESTE: " +  dataHoje.equals(inicioExistente));
							
						}

						if(dataHoje.after(fimExistente))
						{
							quarto.setReservado(false);
							Quarto.atualizar(quarto);
							Reserva.cancelarReserva(reservaExistente);

							System.out.println("CANCELADO: " + quarto);
						}
					}
				}
			}
		}
	}	
	
	private int cont = 0;
}